package org.afs.gescol.gwt.server.service.util;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.afs.gescol.gwt.shared.DocContentsModel;
import org.afs.gescol.gwt.shared.GlobalConstantesModel;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;

/**
 * PDF printer class utility.
 * @autor Kobla GBENYO (kobla.gbenyo@gmail.com)
 */
public class PDFDocumentsServlet extends HttpServlet {

    /** Serial Version UID. */
    private static final long serialVersionUID = -1392449676126393316L;

    /**
     * {@inheritDoc}
     */
    public void init() throws ServletException {
        super.init();
    }

    /**
     * {@inheritDoc}
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // Getting document contents in the session by its type.
        DocContentsModel docContentsModel = null;
        final String typeDoc = request.getParameter(GlobalConstantesModel.DOC_TYPE);
        if (typeDoc.equals(GlobalConstantesModel.EDT_DOC)) {
            docContentsModel = (DocContentsModel) request.getSession().getAttribute(GlobalConstantesModel.EDT_DOC);
        } else if (typeDoc.equals(GlobalConstantesModel.BULLETIN_DOC)) {
            docContentsModel = (DocContentsModel) request.getSession().getAttribute(GlobalConstantesModel.BULLETIN_DOC);
        }

        // Response type
        response.setContentType("application/pdf");

        // File name
        response.setHeader("Content-disposition", "attachment; filename=\"docDefautName.pdf\"");

        // PDF generation
        try {
            genererPDF(docContentsModel, response.getOutputStream());
        } catch (DocumentException e) {
            e.printStackTrace();
            throw new ServletException("Erreur lors de la génération du PDF");
        }


    }

    /**
     * Génère la grille de tarifs PDF.
     * @param grilleTarifs la grille des tarifs
     * @param output le flux de sortie
     * @throws DocumentException erreur lors de l'ouverture d'une connection vers le document
     * @throws IOException erreur I/O
     */
    private void genererPDF(DocContentsModel grilleTarifs, OutputStream output) throws DocumentException, IOException {
        final Document doc = new Document(PageSize.A4);
        final float marginTop = 20f;
        final float marginBottom = 40f;
        doc.setMargins(0, 0, marginTop, marginBottom);
        final PdfWriter writer = PdfWriter.getInstance(doc, output);

        genererInfosCodificationProduitPrincipal(doc, grilleTarifs);

        doc.open();
        final PdfContentByte cb = writer.getDirectContent();

        // Ajout de la matrice
        ajouterMatrice(writer, cb);

        // Génération du titre
        genererTitre(doc, grilleTarifs);
//
//        // Génération de la cotisation
//        genererCotisation(doc, grilleTarifs);
//
//        // Génération de la grille des tarifs
//        genererGrilleTarifs(doc, grilleTarifs);

        // Fermeture
        doc.close();
        output.flush();
        output.close();

    }

    /**
     * Ajoute la matrice en fonction du rôle de l'utilisateur.
     * @param writer handler sur le document PDF
     * @param cb contenu du document PDF
     * @param role le rôle
     * @throws IOException erreur d'accés au fichier
     */
    private void ajouterMatrice(PdfWriter writer, PdfContentByte cb) throws IOException {
        final PdfReader reader = new PdfReader(this.getClass().getClassLoader().getResource("matrice.pdf"));
        final PdfImportedPage page1 = writer.getImportedPage(reader, 1);
        final float scaleToX = 1f;
        final float scaleToY = 1f;
        cb.addTemplate(page1, scaleToX, 0, 0, scaleToY, 0, 0);
    }

    /**
     * Génère le titre de la grille.
     * @param doc le document PDF
     * @param grilleTarifs la grille des tarifs
     * @throws DocumentException erreur lors de l'ouverture d'une connection vers le document
     */
    private void genererTitre(Document doc, DocContentsModel grilleTarifs) throws DocumentException {

        final StringBuffer titre = new StringBuffer("Grille des tarifs");
        titre.append("\n-\n");
        titre.append(grilleTarifs.getTitle().toUpperCase());
        titre.append("\n\n au ");
        titre.append(grilleTarifs.getSecondTitle());


//        final Paragraph paragrapheTitre = new Paragraph(titre.toString(), StylePDF.POLICE_TITRE_GRILLE_TARIFS);
        final Paragraph paragrapheTitre = new Paragraph(titre.toString());
        paragrapheTitre.setAlignment(Element.ALIGN_CENTER);

        final PdfPTable table = new PdfPTable(1);
        final PdfPCell cell = new PdfPCell();
        cell.addElement(paragrapheTitre);
        cell.setBorder(0);
        final int paddingLeft = 147;
        cell.setPaddingLeft(paddingLeft);
        table.addCell(cell);

        final float[] witdh = {1};
        table.setWidths(witdh);

        doc.add(table);
    }

//    /**
//     * Génère la cotisation de la grille.
//     * @param doc le document PDF
//     * @param grilleTarifs la grille des tarifs
//     * @throws DocumentException erreur lors de l'ouverture d'une connection vers le document
//     */
//    private void genererCotisation(Document doc, GrilleTarifsGwt grilleTarifs) throws DocumentException {
//
//        final StringBuffer cotisation = new StringBuffer("Cotisation : ").append(grilleTarifs.getLibelleTypePayeur());
//
//        final Paragraph paragrapheTitre = new Paragraph(cotisation.toString(), StylePDF.POLICE_TEXTE_NOIR_09);
//        paragrapheTitre.setAlignment(Element.ALIGN_CENTER);
//
//        final PdfPTable table = new PdfPTable(1);
//        final PdfPCell cell = new PdfPCell();
//        cell.addElement(paragrapheTitre);
//        cell.setBorder(0);
//        final int paddingLeft = 147;
//        cell.setPaddingLeft(paddingLeft);
//        table.addCell(cell);
//
//        final float[] witdh = {1};
//        table.setWidths(witdh);
//        final int espace = 80;
//        table.setSpacingBefore(espace);
//
//        doc.add(table);
//    }
//
//    /**
//     * Génère les infos de la grille.
//     * @param grilleTarifs la grille des tarifs
//     */
//    private PdfPCell genererInfos(GrilleTarifsGwt grilleTarifs) {
//
//        // Générer les infos
//        final StringBuffer rappelCriteres = new StringBuffer("Tarifs");
//        if (grilleTarifs.getDateEffet() != null) {
//            rappelCriteres.append(" au ");
//            rappelCriteres.append(grilleTarifs.getDateEffet());
//        }
//        rappelCriteres.append(" pour ");
//        if (grilleTarifs.getLibelleProduitPrincipalCriteres() != null) {
//            rappelCriteres.append(grilleTarifs.getLibelleProduitPrincipalCriteres());
//        }
//        if (grilleTarifs.getListePhrasesProduitsLies() != null && grilleTarifs.getListePhrasesProduitsLies().length > 0) {
//            rappelCriteres.append("\n");
//            for (int i = 0; i < grilleTarifs.getListePhrasesProduitsLies().length; i++) {
//                if (i != 0) {
//                    rappelCriteres.append(",");
//                }
//                rappelCriteres.append(" ").append(grilleTarifs.getListePhrasesProduitsLies()[i]);
//            }
//        }
//
//        final Paragraph paragrapheCriteres = new Paragraph(rappelCriteres.toString(), StylePDF.POLICE_RECAPITULATIF_CRITERES);
//        paragrapheCriteres.setAlignment(Element.ALIGN_CENTER);
//        final PdfPCell cell = new PdfPCell();
//        cell.addElement(paragrapheCriteres);
//        cell.setBorder(0);
//        final float paddingTop = 20f;
//        cell.setPaddingTop(paddingTop);
//        return cell;
//    }
//
//
//    /**
//     * Génère la grille de tarifs.
//     * @param doc le document PDF
//     * @param grilleTarifs la grille des tarifs
//     * @throws DocumentException erreur lors de l'ouverture d'une connection vers le document
//     */
//    private void genererGrilleTarifs(Document doc, GrilleTarifsGwt grilleTarifs) throws DocumentException {
//
//        // Création du tableau
//        final PdfPTable table = new PdfPTable(grilleTarifs.getLibellesColonnes().length + 1);
//        final float[] largeursColonnes = new float[grilleTarifs.getLibellesColonnes().length + 1];
//        final float largeurColonne0 = 0.15f;
//        largeursColonnes[0] = largeurColonne0;
//
//        // Calcul de la taille des colonnes
//        final float pourcentageRestant = 0.85f;
//        final float pourcentageTailleColonne = pourcentageRestant / grilleTarifs.getLibellesColonnes().length;
//
//        // Première cellule vide
//        final PdfPCell celluleVide = new PdfPCell(new Phrase());
//        celluleVide.setBorderColor(StylePDF.COULEUR_BLANC);
//        table.addCell(celluleVide);
//
//        // Remplissage des libellés de compo familiale
//        for (int i = 0; i < grilleTarifs.getLibellesColonnes().length; i++) {
//            final PdfPCell celluleLibColonne = getCelluleTexte(grilleTarifs.getLibellesColonnes()[i], StylePDF.POLICE_TEXTE_BLANCHE_07_GRAS,
//                    Element.ALIGN_CENTER);
//            celluleLibColonne.setBackgroundColor(StylePDF.COULEUR_BLEU_FONCE);
//            celluleLibColonne.setBorderColor(StylePDF.COULEUR_BLANC);
//
//            celluleLibColonne.setVerticalAlignment(Element.ALIGN_MIDDLE);
//            table.addCell(celluleLibColonne);
//            largeursColonnes[i + 1] = pourcentageTailleColonne;
//        }
//
//        // Remplissage des lignes
//        for (int i = 0; i < grilleTarifs.getLibellesAutreCritere().length; i++) {
//
//            // Cellule libellé âge
//            final PdfPCell celluleLibAutreCritere = getCelluleTexte(grilleTarifs.getLibellesAutreCritere()[i],
//                    StylePDF.POLICE_TEXTE_BLEUFONCE_07_GRAS, Element.ALIGN_LEFT);
//            celluleLibAutreCritere.setBackgroundColor(StylePDF.COULEUR_4);
//            celluleLibAutreCritere.setBorderColor(StylePDF.COULEUR_BLANC);
//            celluleLibAutreCritere.setVerticalAlignment(Element.ALIGN_MIDDLE);
//            table.addCell(celluleLibAutreCritere);
//
//            // Parcours de chaque colonne de la ligne
//            for (int j = 0; j < grilleTarifs.getLibellesColonnes().length; j++) {
//                final PdfPCell celluleMontant = getCelluleTexte(grilleTarifs.getGrilleMontants()[j][i], StylePDF.POLICE_TEXTE_BLEUFONCE_07_GRAS,
//                        Element.ALIGN_CENTER);
//                celluleMontant.setVerticalAlignment(Element.ALIGN_MIDDLE);
//                table.addCell(celluleMontant);
//            }
//        }
//
//        // Ajout des infos
//        final PdfPCell celluleInfos = genererInfos(grilleTarifs);
//        celluleInfos.setColspan(grilleTarifs.getLibellesColonnes().length + 1);
//        table.addCell(celluleInfos);
//
//        table.setWidths(largeursColonnes);
//        final int taillePourcentage = 93;
//        table.setWidthPercentage(taillePourcentage);
//        final int espace = 10;
//        table.setSpacingBefore(espace);
//        doc.add(table);
//
//    }

    /**
     * Génère la codification du produit.
     * @param doc le document PDF
     * @param grilleTarifs la grille des tarifs
     * @throws DocumentException erreur lors de l'ouverture d'une connection vers le document
     */
    private void genererInfosCodificationProduitPrincipal(Document doc, DocContentsModel grilleTarifs) throws DocumentException {
        final StringBuffer codification = new StringBuffer();
        codification.append("test Footer Header");
//        if (grilleTarifs.getProduitAiaProduitPrincipal() != null && !"".equals(grilleTarifs.getProduitAiaProduitPrincipal().trim())) {
//            codification.append(grilleTarifs.getProduitAiaProduitPrincipal().trim());
//        }
//        if (grilleTarifs.getGarantieAiaProduitPrincipal() != null && !"".equals(grilleTarifs.getGarantieAiaProduitPrincipal().trim())) {
//            if (codification.length() > 0) {
//                codification.append(" / ");
//            }
//            codification.append(grilleTarifs.getGarantieAiaProduitPrincipal().trim());
//        }
//        if (grilleTarifs.getIdBareme1ProduitPrincipal() != null && !"".equals(grilleTarifs.getIdBareme1ProduitPrincipal().trim())) {
//            if (codification.length() > 0) {
//                codification.append(" / ");
//            }
//            codification.append(grilleTarifs.getIdBareme1ProduitPrincipal());
//        }
//        if (grilleTarifs.getIdBareme2ProduitPrincipal() != null && !"".equals(grilleTarifs.getIdBareme2ProduitPrincipal().trim())) {
//            if (codification.length() > 0) {
//                codification.append(" / ");
//            }
//            codification.append(grilleTarifs.getIdBareme2ProduitPrincipal());
//        }

//        final Paragraph paragrapheCodification = new Paragraph(codification.toString(), StylePDF.POLICE_TEXTE_NOIR_05);
        final Paragraph paragrapheCodification = new Paragraph(codification.toString());
        final HeaderFooter footer = new HeaderFooter(paragrapheCodification, false);
        footer.setBorder(Rectangle.NO_BORDER);
        footer.setAlignment(HeaderFooter.ALIGN_CENTER);
        doc.setFooter(footer);

    }

//    /**
//     * Retourne une cellule pour du texte normal sans bordure.
//     * @param libelle texte de la cellule
//     * @return cellule
//     */
//    private PdfPCell getCelluleTexte(final String libelle, Font style, int alignementHorizontal) {
//        final PdfPCell cellule = new PdfPCell(new Phrase(libelle, style));
//        cellule.setHorizontalAlignment(alignementHorizontal);
//        return cellule;
//    }

}